/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.asportoonline.actions;

import org.asportoonline.entities.Indirizzo;
import java.io.IOException;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.asportoonline.business.beans.ClienteManager;
import org.asportoonline.business.delegates.ClienteManagerDelegate;
import org.asportoonline.context.ContextObjectFactory;
import org.asportoonline.context.RequestObject;
import org.asportoonline.context.ResponseAndView;
import org.asportoonline.context.ResponseObject;
import org.asportoonline.controller.Action;
import org.asportoonline.entities.Cliente;
import org.asportoonline.various.UtenteValidation;
import static org.asportoonline.various.Utils.MD5pwd;

/**
 *
 * @author Luca
 */
public class UtenteAction implements Action{
    private static ClienteManager cm = new ClienteManagerDelegate();
    /*
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String s = request.getParameter("q");
        
        if(s.equals("register_user_action")) {
            String res = verifica_registrazione(request);
            if(res.equals("OK")) {
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=register_user").forward(request, response);
            }
        }
        
        else if(s.equals("fetch_user_data_action")) {
            HttpServletRequest res = recupera_dati(request);
            if(res!=null) {
                getServletContext().getRequestDispatcher("/MainController?q=modify_user").forward(request, response);
            }
            else {
                request.setAttribute("error", "Errore nel recupero dei dati!!!");
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
        }
        
        else if(s.equals("modify_user_action")) {
            String res = modifica_dati(request);
            if(res.equals("OK")) {
                request.setAttribute("error", "Dati modificati corretamente!!!");
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=fetch_user_data_action").forward(request, response);
            }
        }
        
        else if(s.equals("change_password_action")) {
            String res = cambia_password(request);
            if(res.equals("OK")) {
                request.setAttribute("error", "Password modificata correttamente!!");  //in qst caso error serve a dire che tutto è andato a buon fine
                getServletContext().getRequestDispatcher("/MainController?q=fetch_user_data_action").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=edit_password").forward(request, response);
            }
        }
        
        else if(s.equals("login_action")) {
            String res = verifica_login(request);
            if(res.equals("OK")) {
                getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
            }
            else {
                request.setAttribute("error", res);
                getServletContext().getRequestDispatcher("/MainController?q=login").forward(request, response);
            }
        }
        
        else if(s.equals("logout_action")) {
            HttpSession ses = request.getSession();
            ses.invalidate();
            getServletContext().getRequestDispatcher("/MainController?q=index").forward(request, response);
        }
                
    } 
    */

 
 
    
    private String verifica_registrazione(RequestObject request, ResponseObject response ) {
        String nome = request.getValueRequest("nome").toString().trim();
        String cognome = request.getValueRequest("cognome").toString().trim();
        String via = request.getValueRequest("via").toString().trim();
        String cap = request.getValueRequest("cap").toString().trim();
        String citta = request.getValueRequest("citta").toString().trim();
        double latitudine = Double.parseDouble(request.getValueRequest("latitudine").toString());
        double longitudine = Double.parseDouble(request.getValueRequest("longitudine").toString());
        String telefono = request.getValueRequest("telefono").toString().trim();
        Indirizzo indirizzo = new Indirizzo();
        String cf = request.getValueRequest("cf").toString().trim();
        String email = request.getValueRequest("email").toString().trim();
        String conferma_email = request.getValueRequest("conferma_email").toString().trim();
        String password = request.getValueRequest("password").toString();
        String conferma_pwd = request.getValueRequest("conferma_password").toString();
        String datan = request.getValueRequest("datan").toString().trim();
        Calendar dn = null;
        String urlimmagine = request.getValueRequest("urlimmagine").toString().trim();
        short tipo;
        
        if(request.getValueRequest("tipo").toString().equals("cliente")) {
            tipo = 0;
        }
        else tipo = 1;
        
        /* CONTROLLI SUI CAMPI */
        //i campi obbligatori non possono essere vuoti
        if(via.isEmpty() || cap.isEmpty() || citta.isEmpty()) {            
           return "Inserire tutti i campi dell'indirizzo!!!";            
        }
        else {
            indirizzo.setCap(cap);
            indirizzo.setCitta(citta);
            indirizzo.setVia(via);
            indirizzo.setLatitudine(latitudine);
            indirizzo.setLongitudine(longitudine);
        }
        
        //l'email deve essere valida e univoca perche' rappresenta lo username
        if(!UtenteValidation.validateEmail(email)) {
            return "L'email inserita non e' corretta!!!";
        }
        else if(!email.equals(conferma_email)) {
            return "Inseriti due indirizzi email diversi!!!";
        }
        else if(cm.cercaCliente(email) != null) {
            return "L'email inserita non e' disponiibile!!!";
        }
        
        
        //la data di nascita deve essere corretta nel formato e nel contenuto
        if(!UtenteValidation.validateDate(datan)) {
            return "Data di nascita non corretta!!!";
        }
        else {
            String arr[] = datan.split("/");
            int y = Integer.parseInt(arr[2]);
            int m = Integer.parseInt(arr[1])-1;
            int d = Integer.parseInt(arr[0]);
            dn = Calendar.getInstance();
            dn.set(y, m, d);
        }
        
        //controllo CF
        if(!UtenteValidation.validateCF(cf)) {
            return "CF non corretto!!!";
        }
        
        //controllo la password
        if(!password.equals(conferma_pwd)) {
            return "Password non confermata correttamente!!";
        }
        else if(!UtenteValidation.validatePassword(password)) {
            return "La password deve contenere solo caratteri alfanumerici piu' _, e tra 6 e 20 caratteri!!!";
        }
        else {
            password = MD5pwd(password);
        }
        
        //controllo il nome
        if(!UtenteValidation.validateName(nome)) {
            return "Il nome non e' corretto!!";
        }
        
        //controllo il cognome
        if(!UtenteValidation.validateSurname(cognome)) {
            return "Il cognome non e' corretto!!";
        }
        
        /* SETTO I CAMPI DI CLIENTE (ora sono tutti corretti) */
        Cliente c = new Cliente();
        
        c.setCf(cf);
        c.setCognome(cognome);
        c.setData_nascita(dn);
        c.setEmail(email);
        c.setIndirizzo(indirizzo);
        c.setNome(nome);
        c.setPassword(password);
        if(!telefono.isEmpty())     c.setTelefono(telefono);
        c.setTipo(tipo);
        if(!urlimmagine.isEmpty())  c.setUrlimmagine(urlimmagine);
        
        cm.inserisciCliente(c);
        /*
        HttpSession ses = request.getSession();
        ses.setAttribute("username", email);
        ses.setAttribute("password", password);
        ses.setAttribute("userid", c.getIdCliente());
        ses.setAttribute("tipo_utente", c.getTipo());
        */
        return "OK";
    }
    
    private HttpServletRequest recupera_dati(HttpServletRequest request) throws ServletException, IOException {
        HttpSession ses = request.getSession(false); //Se non c'è la sessione, NON ne crea una nuova!!!
        
        if (ses == null) {
            return null;
        }
        
        Cliente c = cm.cercaCliente(ses.getAttribute("username").toString());
        request.setAttribute("nome", c.getNome());
        request.setAttribute("cognome", c.getCognome());
        request.setAttribute("via", c.getIndirizzo().getVia());
        request.setAttribute("cap", c.getIndirizzo().getCap());
        request.setAttribute("citta", c.getIndirizzo().getCitta());
        request.setAttribute("telefono", c.getTelefono());
        request.setAttribute("cf", c.getCf());        
        request.setAttribute("email", c.getEmail());
        request.setAttribute("urlimmagine", c.getUrlimmagine());
        
        //Lavoro la data di nascita perché è un Calendar
        Calendar cal = Calendar.getInstance();
        cal = (Calendar)c.getData_nascita();
        String y = String.valueOf(cal.get(Calendar.YEAR)); //Usando una classe Java già esistente mi tito fuori l'anno e tutto il resto!!
        String m = String.valueOf(cal.get(Calendar.MONTH)+1); //Per quanto rigurada il mese va aggiunta un unità.
        String d = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));        

        String datanascita = d+"/"+m+"/"+y;
        
        request.setAttribute("datan", datanascita);
        
        return request;
    }
    
    private String modifica_dati(HttpServletRequest request) throws ServletException, IOException {
        String via = request.getParameter("via").toString().trim();
        String cap = request.getParameter("cap").toString().trim();
        String citta = request.getParameter("citta").toString().trim();
        double latitudine = Double.parseDouble(request.getParameter("latitudine").toString());
        double longitudine = Double.parseDouble(request.getParameter("longitudine").toString());
        String telefono = request.getParameter("telefono").toString().trim();
        Indirizzo indirizzo = new Indirizzo();
        String urlimmagine = request.getParameter("urlimmagine").toString().trim();

        /* CONTROLLI SUI CAMPI */
        //i campi obbligatori non possono essere vuoti
        if(via.isEmpty() || cap.isEmpty() || citta.isEmpty()) {            
           return "Inserire tutti i campi dell'indirizzo!!!";            
        }
        else {
            indirizzo.setCap(cap);
            indirizzo.setCitta(citta);
            indirizzo.setVia(via);
            indirizzo.setLatitudine(latitudine);
            indirizzo.setLongitudine(longitudine);
        }
                
        /* SETTO I CAMPI DI CLIENTE (ora sono tutti corretti) */
        HttpSession ses = request.getSession(false);
        if(ses == null) {           //teoricamente non fallisce mai!!!
            return "Errore nel recupero della sessione!!";
        }
        
        Cliente c = cm.cercaCliente(ses.getAttribute("username").toString());
        if(c == null) {             //teoricamente non fallisce mai!!!
            return "Utente non trovato!!";
        }
        
        c.setIndirizzo(indirizzo);
        c.setTelefono(telefono);
        c.setUrlimmagine(urlimmagine);
        
        cm.aggiornaCliente(c);
        
        return "OK";
    }
    
    private String cambia_password(HttpServletRequest request) throws ServletException, IOException {
        String vecchia_password = request.getParameter("vecchia_password").toString();
        String nuova_password = request.getParameter("nuova_password").toString();
        String conferma_password = request.getParameter("conferma_password").toString();
        
        if(vecchia_password.isEmpty() || nuova_password.isEmpty() || conferma_password.isEmpty()) {
            return "I campi non sono stati inseriti correttamente!!";
        }
        
        HttpSession ses = request.getSession(false);
        if(ses == null) {           //teoricamente non fallisce mai!!!
            return "Errore nel recupero della sessione!!";
        }
        
        Cliente c = cm.cercaCliente(ses.getAttribute("username").toString());
        if(c == null) {             //teoricamente non fallisce mai!!!
            return "Utente non trovato!!";
        }
                
        vecchia_password = MD5pwd(vecchia_password);
        if(!c.getPassword().equals(vecchia_password)) {
            return "La password non è stata inserita correttamente!!";
        }
        
        if(!UtenteValidation.validatePassword(nuova_password)) {
            return "La nuova password deve contenere solo caratteri alfanumerici piu' _, e tra 6 e 20 caratteri!!!";
        }
        
        if(!nuova_password.equals(conferma_password)) {
            return "La nuova password non è stata confermata correttamente!!";
        }
        
        nuova_password = MD5pwd(nuova_password);
        
        c.setPassword(nuova_password);
        
        cm.aggiornaCliente(c);
        
        ses.setAttribute("password", nuova_password);
        
        return "OK";       
    }
    
    private int esegui_login(RequestObject requestObject,ResponseObject response) {
        String email = requestObject.getValueRequest("email").toString();
        String password = requestObject.getValueRequest("password").toString();
        password = MD5pwd(password);
        //System.out.println("controllo "+email);
      //  System.out.println("controllo "+password);
        Cliente c = cm.cercaCliente(email);
        
        if(c == null) {
            System.out.println("no client");
            return -1;
        }
        
        if(!c.getPassword().equals(password)) {
            System.out.println("no pass");
            return -2;
        }
          
        
     
       
        response.setValueInSession("username", email);
        response.setValueInSession("password", password);
        response.setValueInSession("userid", c.getIdCliente());
        response.setValueInSession("tipo_utente", c.getTipo());
  
        requestObject.setValueInSession("username", email);
        requestObject.setValueInSession("password", password);
        requestObject.setValueInSession("userid", c.getIdCliente());
        requestObject.setValueInSession("tipo_utente", c.getTipo());
        
        //HttpSession ses = request.getSession();
        //ses.setAttribute("username", email);
        //ses.setAttribute("password", password);
        //ses.setAttribute("userid", c.getIdCliente());
        //ses.setAttribute("tipo_utente", c.getTipo());
        
        return 1;
    }
    public static String recupera_username(RequestObject request){
         if(!request.findValueSession("username") || !request.findValueSession("password"))
         {
             request.printAll();
             System.out.println("esco subito");
            return "Ospite";    
         }
        String username = request.getValueSession("username").toString();
        System.out.println("debug recupera: "+username);
         Cliente c = cm.cercaCliente(username);
                if(username != null &&  c != null)                     
                        return c.getNome();
                     
             
          return "Ospite";
    }
    public static int controlla_login(RequestObject request){
        if(!request.findValueSession("username") || !request.findValueSession("password")){
            System.out.println("controllo esco subito");
            return 0;    
        }
        String username = request.getValueSession("username").toString();
        String password = request.getValueSession("password").toString();
        System.out.println("debug controllo: "+username+password);
          
        Cliente c = cm.cercaCliente(username);
      
        
        Set s = request.getSessionKeys();
        Set s2 = request.getRequestKeys();
        Iterator i2 = s2.iterator();
        Iterator i = s.iterator();
       while(i.hasNext()){
           
           System.out.println("sessione: "+i.next());
          
       }
       while(i2.hasNext()){
           
           System.out.println("request: "+i2.next());
          
       }
       
        if(username != null && password != null && c != null){
            if(c.getPassword().equals(password))
                return 1;
        }
        
        //System.out.println("cippa: "+username);
        
        
      
       // String email = request.getValue("username").toString();
       // if(email == null) return -1;
        
        
        
        return 0;
    }
    private boolean esegui_logout(RequestObject request, ResponseObject response){
        //response.setValueInSession("username", null);
        //response.setValueInSession("password", null);
        
        /*
        request.setValueInSession("username", " ");
        request.setValueInSession("password", " ");
        request.setValueInSession("userid", " ");
        request.setValueInSession("tipo_utente", " ");
      */
        response.setValueInSession("username", " ");
        response.setValueInSession("password", " ");
        response.setValueInSession("userid", " ");
        response.setValueInSession("tipo_utente", " ");
       
        Set s = response.getSessionKeys();
        Set s2 = response.getRequestKeys();
        Iterator i2 = s2.iterator();
        Iterator i = s.iterator();
       while(i.hasNext()){
           
           System.out.println("logout sessione: "+i.next()+response.getValueSession("username"));
          
       }
       while(i2.hasNext()){
           
           System.out.println("logout request: "+i2.next());
          
       }
     
        return true;
    }
    public ResponseAndView createResponseAndView(RequestObject requestObject) {
         ResponseObject response = ContextObjectFactory.getResponseObject();
          String s = requestObject.getValueRequest("q").toString();
          if(s.equals("login")){
   
              if(esegui_login(requestObject,response)==1){
                   System.out.println("login eseguito come: "+recupera_username(requestObject));
                   response.setValue("utente", recupera_username(requestObject));
                  return new ResponseAndView(response,"index");
              }
              else{
                  response.setValue("utente", "Ospite");
                  response.setValue("error", "Login Errato!");
                  return new ResponseAndView(response,"login");
              }
          }
          else if(s.equals("esegui-login")){
            if(controlla_login(requestObject) == 1){
                    System.out.println("esegui login Nome: "+recupera_username(requestObject));
                    //response.setValue("utente", recupera_username(requestObject));
            }
            else{
                    System.out.println("Controllo Login Fallito, sei un Ospite");
                    response.setValue("utente", "Ospite");
            }
              return new ResponseAndView(response,"login");
          }
          else if(s.equals("reg")){
               return new ResponseAndView(response,"reg");
         
          }
          else if(s.equals("protetta")){
              if(controlla_login(requestObject)==1){
                  System.out.println("ok");
              }
              else
                  System.out.println("porcodio");                  
          }
          else if(s.equals("logout")){
              System.out.println("logout");
              esegui_logout(requestObject,response);
              response.setValue("utente", "Ospite");
              return new ResponseAndView(response,"index");
          }
          else if(s.equals("esegui-reg")){
              String res = verifica_registrazione(requestObject,response);
              System.out.println("verifico reg");
              if(res.equals("OK")){
                  System.out.println("SI");
                  response.setValue("error", "Ok registrazione avvenuta con successo!");
                  return new ResponseAndView(response,"index");
              }
              else{
                  System.out.println("NO"+res);
                  response.setValue("error","qualcosa non é andato bene");
                  return new ResponseAndView(response,"reg");
              }
                
              
          }
         //response.setValue("localita", lm.recuperaTutteLeLocalita());
         return new ResponseAndView(response,"login");
        //throw new UnsupportedOperationException("Not supported yet.");
    }

}
